#!/usr/bin/env python3.10
# -*- encoding: utf-8 -*-
"""
@File    :   login.py
@Time    :   2024/01/02 11:36:45
@Author  :   windstarry 
@Version :   1.0
"""
# here put the import lib
from datetime import datetime
from django.contrib.auth import authenticate
from django.forms import model_to_dict
from ninja import Router
from typing import Union

from utils.core import R
from utils.jwt import Jwt
from big_event.settings import SECRET_KEY, TOKEN_LIFETIME
from system.models import Users
from system.schema import LoginSchema,RegisterSchema,LoginResult,UserInfo


router = Router()

   
# 用户登录
@router.post("/login", summary="登录", response=Union[LoginResult, R],auth=None)
def login(request, auth: LoginSchema):
    """
    函数功能：用户登录函数
    参数：
    - request: 请求对象
    - auth: 包含用户名和密码的LoginSchema对象
    返回：
    - Response对象,包含登录结果信息和用户信息及token
    """
    # 调用authenticate函数验证用户名和密码
    user_obj = authenticate(username=auth.username, password=auth.password)

    if user_obj:
        user_obj_dic = model_to_dict(user_obj)
        del user_obj_dic['password']
        del user_obj_dic['user_pic']
        # 获取当前时间戳和token的有效期
        time_now = int(datetime.now().timestamp())
        jwt = Jwt(SECRET_KEY, user_obj_dic, valid_to=time_now + TOKEN_LIFETIME)
        # 构建返回的字典
        data_dic = {
            "token": f"Bearer {jwt.encode()}",
        }
        #以LoginResult格式返回登录结果
        data = LoginResult(**data_dic)
        # 返回登录成功的Response对象
        return R.ok(data=data, msg="登录成功")
    else:
        # 返回登录失败的Response对象
        return R.fail(msg="用户名或密码错误")
    

# 用户注册
@router.post("/reg", summary="注册", response=Union[UserInfo, R],auth=None)
def register(request, auth: RegisterSchema):
    """
    函数功能：用户注册函数
    参数：
    - request: 请求对象
    - auth: 包含用户名和密码的RegisterSchema对象
    返回：
    - Response对象,包含登录结果信息和用户信息及token
    """
    # 验证用户名是否存在
    if Users.objects.filter(username=auth.username).exists():
        # 返回注册失败的Response对象
        return R.fail(msg="用户名已存在")
    else:
        # 验证密码是否一致
        if auth.password!= auth.repassword:
            # 返回注册失败的Response对象
            return R.fail(msg="两次密码不一致")
        else:
            try:
                # 调用create_user函数创建用户
                user_obj = Users.objects.create_user(username=auth.username, password=auth.password)
                data = UserInfo(**model_to_dict(user_obj))
                return R.ok(data=data,msg="注册成功")
            except Exception as e:
                # 返回注册失败的Response对象
                return R.fail(msg=str(e))


# 用户退出
@router.post("/logout", summary="退出", response=R,auth=None)
def logout(request):
    """
    函数功能：用户退出函数
    参数：
    - request: 请求对象
    返回：
    - Response对象
    """
    # 返回退出成功的Response对象
    return R.ok(msg="用户退出")

            
    
